package com.jizefeng.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Reflection {
    public static void main(String[] args) throws Exception{
        // 获取A的Class对象 classForName
        Class<?> classForName = Class.forName("com.jizefeng.reflect.A");
        System.out.println("A的getName："+classForName.getName());
        System.out.println("A的getSimpleName："+classForName.getSimpleName());
        // 创建A实例
        System.out.println("下面是A的实例");
        // 通过无参构造函数创建实例
        A aclassForName = (A)classForName.getDeclaredConstructor().newInstance();
        System.out.println("无参实例：");
        System.out.println("A的aInstance："+aclassForName);
        System.out.println("getClass："+aclassForName.getClass());
        // 通过有参构造函数创建实例
        A aclassForName1 = (A)classForName.getDeclaredConstructor(String.class).newInstance("jizefeng");
        System.out.println("有参实例：");
        System.out.println("A的aInstance1："+aclassForName1);
        System.out.println("getClass："+aclassForName1.getClass());
        // 获取A的方法
        System.out.println("A的所有方法：");
        Method[] declaredMethods = classForName.getDeclaredMethods();
//        for (Method declaredMethod : declaredMethods) {
//            System.out.println("A的方法："+declaredMethod);
//        }
        // 获取A的公共方法
        Method declaredMethod = classForName.getDeclaredMethod("show");
        declaredMethod.invoke(aclassForName);
        // 获取A的私有方法
        Method declaredMethod1 = classForName.getDeclaredMethod("show", String.class);
        declaredMethod1.setAccessible(true);
        declaredMethod1.invoke(aclassForName,"A的私有方法被调用");
        // 获取A的属性
        System.out.println("A的所有属性：");
        for (Field declaredField : classForName.getDeclaredFields()) {
            System.out.println("A的属性："+declaredField);
        }
        Field name = classForName.getDeclaredField("name");
        name.setAccessible(true);
        name.set(aclassForName1,"修改私有属性");
        System.out.println("aclassForName1的name属性："+aclassForName1.getName());
    }
}
